/**
 * \file Pixel.h
 * \author Florian LANCE - Armand POLI
 * \version 1.0
 * \date septembre 2011
 */


#ifndef _PIXEL
#define _PIXEL

#include <vector>
#include <iostream>

typedef unsigned int uint;

/**
* @class Classe Pixel qui définit un pixel contenant un nombre templaté de  valeurs d'entier positifs.
*/
template <uint T_DIM>
class Pixel
{

    public:

        /** @brief  Constructeur par défaut de Pixel */
        Pixel();
        /** @brief  Constructeur de pixel prenant la valeur de dimension 0 en paramètres */
        Pixel(const uint);
        ~Pixel();

        /** @brief  Retourne la valeur de la dimension 0 du pixel */
        uint getVal() const;
        /** @brief  Retourne la valeur de la dimension _numval du pixel */
        uint getVal(const uint _numVal) const;

        /** @brief  Modifie la valeur de dimension 0 du pixel */
        void setVal(const uint);
        /** @brief  Modifie la valeur de dimension _numval du pixel */
        void setVal(const uint _val, const uint _numVal);

    private:

//        enum {nbVal = T_DIM};
        uint nbVal;           /**< Dimension du ixel */
        uint valPixel[T_DIM]; /**< Tableau de taille T_DIM représentant le pixel */
};

#endif



/// ########################################################################## CONSTRUCTEURS / DESTRUCTEURS

template <uint T_DIM>
Pixel<T_DIM>::Pixel()
{
    nbVal = T_DIM;
}

template <uint T_DIM>
Pixel<T_DIM>::Pixel(const uint _val)
{
    valPixel[0] = _val;
    nbVal = T_DIM;
}



template <uint T_DIM>
Pixel<T_DIM>::~Pixel()
{

}

/// ########################################################################## ACCESSEURS

template <uint T_DIM>
uint Pixel<T_DIM>::getVal() const {return valPixel[0];} // on retourne la première valeur par défaut

template <uint T_DIM>
uint Pixel<T_DIM>::getVal(const uint _numVal) const
{

    if(_numVal < nbVal)return valPixel[_numVal];
    else  std::cout << "Erreur: acces interdit (pixel, getVal)." << _numVal << " " << nbVal << " " <<  valPixel[0] << std::endl;
    return 0;
}


/// ########################################################################## MUTATEURS

template <uint T_DIM>
void Pixel<T_DIM>::setVal(const uint _val) {valPixel[0]  = _val;} // on modifie la première valeur par défaut



template <uint T_DIM>
void Pixel<T_DIM>::setVal(const uint _val, const uint _numVal)
{
    if(_numVal < nbVal) valPixel[_numVal] = _val;
    else  std::cout << "Erreur: acces interdit (pixel, setVal)." << _val << " " << _numVal  << std::endl;
}
